package com.kfm.pm;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;

public class DBHelper {

    private Connection conn;
    private PreparedStatement ps;
    private final String JDBC_URL;
    private final String USERNAME;
    private final String PASSWORD;

    public DBHelper() throws IOException {
        Properties prop = new Properties();
        prop.load(new FileInputStream("io\\db.properties"));
        JDBC_URL = prop.getProperty("url");
        USERNAME = prop.getProperty("username");
        PASSWORD = (String) prop.get("password");
    }

    // 这个创建的目的
    // 对外提供几个访问的方法 只需要传递 sql语句 就可以执行 返回查询的结果集 或者 影响行数
    // 频繁的建立连接
    public ResultSet executeQuery(String sql, Object... objects) throws SQLException, ClassNotFoundException {
        // 去数据库中执行
        conn = getConnection();
        ps = preparedStatement(sql);
        setObject(objects);
        return ps.executeQuery();
    }

    public int executeUpdate(String sql, Object... objects) throws SQLException, ClassNotFoundException {
        // 获取连接对象
        conn = getConnection();
        // 获取执行 sql 的对象 Statement
        ps = preparedStatement(sql);
        // 替换sql中的占位符
        setObject(objects);
        return ps.executeUpdate(); // 执行
    }

    /**
     * 将preparedStatement中的占位符替换成具体的值 setObject()
     */
    private void setObject(Object... objects) throws SQLException {
        for (int i = 0; i < objects.length; i++) {
            ps.setObject(i + 1, objects[i]);
        }
    }

    /**
     * 获取数据库连接对象
     *
     * @return
     */
    private Connection getConnection() throws ClassNotFoundException, SQLException {
        if (conn == null) {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD);
        }
        return conn;
    }


    // 预编译sql

    /**
     * 获取执行sql 的对象
     *
     * @param sql 要预编译的sql
     * @return
     */
    private PreparedStatement preparedStatement(String sql) throws SQLException, ClassNotFoundException {
        return conn.prepareStatement(sql);
    }

    public void close() throws SQLException {
        if (ps != null) {
            ps.close();
        }
        // 关闭连接对象
        // 关闭执行sql 的对象
        if (conn != null) {
            conn.close();
        }
    }
}

class Test03 {

    public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
        DBHelper dbHelper = new DBHelper(); // 只有一个连接对象
        int i = dbHelper.executeUpdate("");
        dbHelper.close();
    }
}
